/**
 * Created by Administrator on 2015/12/1.
 */
// setTimeOut 是在指定事件后进行执行
var second = 1000 * 1;
setTimeout(function () {
    console.log("时间后进行执行！");
}, second);


// setInterval() 实在一个时间内一直执行
setInterval(function () {
    console.log("我会一直执行哦！");
}, second);

// 使用一个时间函数控制另外一个
/**
 * 下面写的这个程序永远不会执行 因为在两秒钟执行完之前就已经被清空了！
 * */
var timeout_ms = 2000;
var timeout = setTimeout(function () {
    console.log("2秒钟后进行打印");
}, timeout_ms);
var timeoutclear_ms = 1000;
setTimeout(function () {
    clearTimeout(timeout);
}, timeoutclear_ms);


// 制定和取消函数的重复执行计划
// 使用clearTimeout进行清理 返回的语句句柄


// 使用process.nextTick 将函数执行推迟到下一轮事件循环
// 使用 setTimeout(callback,0) 可以将任务推迟很短的一个时间，第二个参数0 告诉js在所有被挂起的事件处理完毕之后立即执行这个回调函数
// 一般也会在 用户事件处理完毕之后 进行一些运算等

/***
 * Node中的事件循环在一个处理事件队列的循环里运行的，事件没循环执行一次就被称为一个tick
 可以通过安排在事件循环开始下一轮 下一个tick时进行调用回调函数一次，然而，setTimeout使用的是js运行时的内部执行队列，而不是使用事件循环
 通过使用 process.nextTick(callback) 来取代setTimeout(callback,0) 毁掉函数会在事件队列内的所有事件处理完毕后立即执行。这个比激活js中的超时队列快得多
 */
process.nextTick(function () {
    console.log("呀嘿！");
}); // process是node中为数不多的全局对象之一


// 在事件循环中，因为node是单线程的 所以当一个回调函数占用了很长事件时，期间就不能处理其他挂起的事件，导致应用程序变得特别缓慢
// 如果在这个过程中还是用了 内存敏感或者处理器敏感的函数，会导致事件循环变得很慢，造成大量时间堆积，不能得到及时处理
process.nextTick(function nextTick1() {
    var a = 0;
    while (true) {
        a++;
    }
});

process.nextTick(function nextTick2() {
    console.log("next Tick");
})

setTimeout(function timeout() {
    console.log("timeout");
}, 1000);

//在以上这个例子中，nextTick2 和 timeout 永远无法执行，因为事件循环被nextTick1无限阻塞了！


// 退出事件循环 有些事情是一些无关紧要的事件，这些非关键的事件其实可以在一些关键事件之后进行执行

stream.on("data", function (data) {
    stream.end("my response");
    process.nextTick(function () {
        console.log("清理 文件")
    });
});


// setInterval 的不好的地方，如果setInterval里面执行的函数的事件比间隔时间多了的话 会导致两个函数并行执行，这样可能会导致问题的出现
// 如果需要两个函数串行执行
var interval = 1000;
(function schedule() {
    setTimeout(function do_it(){
        my_async_function(function(){
            console.log("async is done1!");
            schedule();
        })
    },interval);
}());
// 以上代码可以保证顺序执行

